/*-----------------------------------------------File Info------------------------------------------------
** File Name:               uart user.h  
** Last modified date:      25022.06.14
** Last version:            V0.1
** Description:             
**
**--------------------------------------------------------------------------------------------------------            
** Created date:            2016.09.8
** author:                  YLY
** Version:                 V0.1
** Descriptions:            串口驱动
**--------------------------------------------------------------------------------------------------------*/

#ifndef __UART_USER_H_
#define __UART_USER_H_

#include "bspConfig.h"
#include "bspGPIO.h"

#define USART0_TDATA_ADDRESS     	((uint32_t)0x40013828)  
#define USART0_RDATA_ADDRESS      	((uint32_t)0x40013824)
#define USART1_TDATA_ADDRESS      	((uint32_t)0x40004428)  
#define USART1_RDATA_ADDRESS      	((uint32_t)0x40004424)

#define UART0_WRITE_DMA_CHANNEL			DMA_CH1
#define UART0_READ_DMA_CHANNEL			DMA_CH2
#define UART1_WRITE_DMA_CHANNEL			DMA_CH3
#define UART1_READ_DMA_CHANNEL			DMA_CH4


#if BSP_MCU_TYPE == BSP_MCU_GD32E23x	
typedef struct 
{
	rcu_periph_enum rcu;
	uint32_t com;
	uint32_t nvicIrq;
    uint32_t nvicIrqPriority;
	
	tsCfgGpio txIo;
	tsCfgGpio rxIo;
	
}tsCfgUart;

#define DEV_UART0_0	/*UART0_A2A3, AF1*/ \
		{RCU_USART0, USART0, USART0_IRQn, 2, /*COM*/\
		RCU_GPIOA, GPIOA, GPIO_PIN_2, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_AF_1, 1,/*TX*/\
		RCU_GPIOA, GPIOA, GPIO_PIN_3, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_OTYPE_OD, GPIO_OSPEED_50MHZ, GPIO_AF_1, 1 /*RX*/}
		
#define DEV_UART0_1	/*UART0_A9A10, AF1*/ \
		{RCU_USART0, USART0, USART0_IRQn, 2, \
		RCU_GPIOA, GPIOA, GPIO_PIN_9, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_AF_1, 1, \
		RCU_GPIOA, GPIOA, GPIO_PIN_10, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_OTYPE_OD, GPIO_OSPEED_50MHZ, GPIO_AF_1, 1}	
		
#define DEV_UART0_2	/*UART0_A14A15, AF1*/ \
		{RCU_USART0, USART0, USART0_IRQn, 2, \
		RCU_GPIOA, GPIOA, GPIO_PIN_14, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_AF_1, 1, \
		RCU_GPIOA, GPIOA, GPIO_PIN_15, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_OTYPE_OD, GPIO_OSPEED_50MHZ, GPIO_AF_1, 1}	
		
#define DEV_UART0_3	/*UART0_B6B7, AF0*/ \
		{RCU_USART0, USART0, USART0_IRQn, 2, \
		RCU_GPIOB, GPIOB, GPIO_PIN_6, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_AF_0, 1, \
		RCU_GPIOB, GPIOB, GPIO_PIN_7, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_OTYPE_OD, GPIO_OSPEED_50MHZ, GPIO_AF_0, 1}			
	
#define DEV_UART1_0	/*UART1_A2A3, AF1*/ \
		{RCU_USART1, USART1,USART1_IRQn, 2, \
		RCU_GPIOA, GPIOA, GPIO_PIN_2, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_AF_1, 1, \
		RCU_GPIOA, GPIOA, GPIO_PIN_3, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_OTYPE_OD, GPIO_OSPEED_50MHZ, GPIO_AF_1, 1}	
		
#define DEV_UART1_1	/*UART1_A14A15, AF1*/ \
		{RCU_USART1, USART0,USARTS1_IRQn, 2, \
		RCU_GPIOB, GPIOB, GPIO_PIN_14, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_AF_1, 1, \
		RCU_GPIOB, GPIOB, GPIO_PIN_15, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_OTYPE_OD, GPIO_OSPEED_50MHZ, GPIO_AF_1, 1}	

#define DEV_UART1_2	/*UART1_A8B0, AF4*/ \
		{RCU_USART1, USART1,USART1_IRQn, 2, \
		RCU_GPIOA, GPIOA, GPIO_PIN_8, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_AF_4, 1, \
		RCU_GPIOB, GPIOB, GPIO_PIN_0, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_OTYPE_OD, GPIO_OSPEED_50MHZ, GPIO_AF_4, 1}	
		
#elif ((BSP_MCU_TYPE == BSP_MCU_GD32F3x0) || (BSP_MCU_TYPE == BSP_MCU_GD32F1x0))
typedef struct 
{
	rcu_periph_enum rcu;
	uint32_t com;
	uint32_t nvicIrq;
    uint8_t nvicIrqPriority;
	uint8_t nvicIrqSubPriority;
	tsCfgGpio txIo;
	tsCfgGpio rxIo;
}tsCfgUart;

#define DEV_UART0_0	/*UART0_A2A3, AF1*/ \
		{RCU_USART0, USART0, USART0_IRQn, 2, 2,/*COM*/\
		RCU_GPIOA, GPIOA, GPIO_PIN_2, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_AF_1, 1, /*TX*/\
		RCU_GPIOA, GPIOA, GPIO_PIN_3, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_OTYPE_OD, GPIO_OSPEED_50MHZ, GPIO_AF_1, 1 /*RX*/}
		
#define DEV_UART0_1	/*UART0_A9A10, AF1*/ \
		{RCU_USART0, USART0, USART0_IRQn, 2, 2, \
		RCU_GPIOA, GPIOA, GPIO_PIN_9, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_AF_1, 1, \
		RCU_GPIOA, GPIOA, GPIO_PIN_10, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_OTYPE_OD, GPIO_OSPEED_50MHZ, GPIO_AF_1, 1}	
		
#define DEV_UART0_2	/*UART0_A14A15, AF1*/ \
		{RCU_USART0, USART0, USART0_IRQn, 2, 2, \
		RCU_GPIOA, GPIOA, GPIO_PIN_14, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_AF_1, 1, \
		RCU_GPIOA, GPIOA, GPIO_PIN_15, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_OTYPE_OD, GPIO_OSPEED_50MHZ, GPIO_AF_1, 1}	
		
#define DEV_UART0_3	/*UART0_B6B7, AF0*/ \
		{RCU_USART0, USART0, USART0_IRQn, 2, 2, \
		RCU_GPIOB, GPIOB, GPIO_PIN_6, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_AF_0, 1, \
		RCU_GPIOB, GPIOB, GPIO_PIN_7, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_OTYPE_OD, GPIO_OSPEED_50MHZ, GPIO_AF_0, 1}			
	
#define DEV_UART1_0	/*UART1_A2A3, AF1*/ \
		{RCU_USART1, USART1, USART1_IRQn, 2, 2, \
		RCU_GPIOA, GPIOA, GPIO_PIN_2, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_AF_1, 1, \
		RCU_GPIOA, GPIOA, GPIO_PIN_3, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_OTYPE_OD, GPIO_OSPEED_50MHZ, GPIO_AF_1, 1}	
		
#define DEV_UART1_1	/*UART1_A14A15, AF1*/ \
		{RCU_USART1, USART1, USARTS1_IRQn, 2, 2, \
		RCU_GPIOB, GPIOB, GPIO_PIN_14, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_AF_1, 1, \
		RCU_GPIOB, GPIOB, GPIO_PIN_15, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_OTYPE_OD, GPIO_OSPEED_50MHZ, GPIO_AF_1, 1}	

#define DEV_UART1_2	/*UART1_A8B0, AF4*/ \
		{RCU_USART1, USART1,USART1_IRQn, 2, 2, \
		RCU_GPIOA, GPIOA, GPIO_PIN_8, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_AF_4, 1, \
		RCU_GPIOB, GPIOB, GPIO_PIN_0, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_OTYPE_OD, GPIO_OSPEED_50MHZ, GPIO_AF_4, 1}	
#endif


		
typedef void (*pUartCallBackFun)(uint8_t *pBuf, uint16_t size);
	
typedef void (*pUartWrIntCbFun)(void);	

typedef struct
{
	uint16_t rxBufSize;
	uint16_t rxCount;
	uint8_t *pRxBuf;	
	pUartCallBackFun pRxCb;
	pUartWrIntCbFun pTxCb;
}tsUart;


extern void uartDeinit(tsCfgUart *cfg);	
extern void uartInit(tsCfgUart *cfg, uint32_t baudRate, 
				uint8_t *pReceBuf, uint32_t bufSize, pUartCallBackFun pCallBack);

extern void uartWrite(tsCfgUart *cfg, uint8_t *pBuf, uint16_t size);

/*
* 中断发送
*/
extern void uartIntWriteByte(tsCfgUart *cfg, uint8_t data, pUartWrIntCbFun cb);
	
#ifdef UART_DAM_EN
extern void uartDmaWrite(tsCfgUart *cfg, uint8_t *pBuf, uint16_t bufSize);
#endif	//UART_DAM_EN

extern void usartReadConfig(tsCfgUart *cfg, bool en);
extern void usartWriteConfig(tsCfgUart *cfg, bool en);
#endif //__UART_USER_H_







